home *** CD-ROM | disk | FTP | other *** search
/ IRIX Base Documentation 2002 November / SGI IRIX Base Documentation 2002 November.iso / usr / share / catman / p_man / cat5 / mmci.z / mmci
Encoding:
Text File  |  2002-10-03  |  55.9 KB  |  1,259 lines

  1.  
  2.  
  3.  
  4. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  5.  
  6.  
  7.  
  8. NNNNAAAAMMMMEEEE
  9.      mmci - Memory Management Control Interface
  10.  
  11. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  12.      This document describes the concepts and interfaces provided by IRIX for
  13.      fine tuning memory management policies for user applications.
  14.  
  15.    PPPPoooolllliiiiccccyyyy MMMMoooodddduuuulllleeeessss
  16.      The ability of applications to control memory management becomes an
  17.      essential feature in multiprocessors with a CCNUMA memory system
  18.      architecture. For most applications, the operating system is capable of
  19.      producing reasonable levels of locality via initial placement; however,
  20.      in order to maximize performance, some applications may need fine tuned
  21.      memory management policies.
  22.  
  23.      We provide a Memory Management Control Interface based on the
  24.      specification of policies for different kinds of operations executed by
  25.      the Virtual Memory Management System. Users are allowed to select a
  26.      policy from a set of available policies for each one of these VM
  27.      operations. Any portion of a virtual address space, down to the level of
  28.      a page, may be connected to a specific policy via a Policy Module.
  29.  
  30.      A policy module or PM contains the policy methods used to handle each of
  31.      the operations shown in the table below.
  32.  
  33.        MEMORY OPERATION          POLICY                  DESCRIPTION
  34.       _______________________________________________________________________
  35.       Initial Allocation   Placement Policy     Determines what physical
  36.                                                 memory node to use when
  37.                                                 memory is allocated
  38.                            Page Size Policy     Determines what virtual page
  39.                                                 size to use to map physical
  40.                                                 memory
  41.                            Fallback Policy      Determines the relative
  42.                                                 importance between placement
  43.                                                 and page size
  44.       _______________________________________________________________________
  45.       Dynamic Relocation   Migration Policy     Determines the aggressiveness
  46.                                                 of memory migration
  47.                            Replication Policy   (not implemented,
  48.                                                 retained for compatibility)
  49.       _______________________________________________________________________
  50.       Paging               Paging Policy        (not implemented,
  51.                                                 retained for compatibility)
  52.  
  53.      When the operating system needs to execute an operation to manage a
  54.      section of a process' address space, it uses the methods specified by the
  55.      Policy Module connected (attached) to that section.
  56.  
  57.      To allocate a physical page, the VM system physical memory allocator
  58.      first determines the page size to be used for the current allocation.
  59.      This page size is acquired using a method provided by the Page Size
  60.      Policy.
  61.  
  62.  
  63.                                                                         PPPPaaaaggggeeee 1111
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  71.  
  72.  
  73.  
  74.      Second, the physical memory allocator calls the method provided by the
  75.      Placement Policy that determines where the page should be allocate from.
  76.      On NUMA systems this method returns a handle identifying the node memory
  77.      should be allocated from. On non-NUMA systems this is treated as a no-op.
  78.      The Placement Policy is described in detail later in this document.
  79.  
  80.      Now, knowing both the page size and the source node, the physical memory
  81.      allocator calls a per-node memory allocator specifying both parameters.
  82.      If the system finds memory on this node that meets the page size
  83.      requirement, the allocation operation finishes successfully; if not, the
  84.      operation fails, and a fallback method specified by the Fallback Policy
  85.      is called. The fallback method provided by this policy decides whether to
  86.      try the same page size on a different node, a smaller page size on the
  87.      same source node, sleep, or just fail.
  88.  
  89.      The Fallback Policy to choose depends on the kind of memory access
  90.      patterns an application exhibits. If the application tends to generate a
  91.      tolerable or low level of cache misses, giving locality precedence over
  92.      the page size may make sense; otherwise, especially if the application's
  93.      working set is large, but has reasonable cache behavior, giving the page
  94.      size higher precedence may make sense.
  95.  
  96.      Once a page has been placed, it stays on its source node until it is
  97.      either migrated to a different node, or paged out and faulted back in.
  98.      On Origin 2000/200 system with dynamic migration enabled, migratability
  99.      of a page is determined by the migration policy. For some applications
  100.      that present a very uniform memory access pattern from beginning to end,
  101.      initial placement may be sufficient and migration can be turned off; on
  102.      the other hand, applications with phase changes may benefit from some
  103.      level of dynamic migration, which has the effect of attracting memory to
  104.      the nodes where it is being used.
  105.  
  106.      The current version of IRIX provides the policies shown in the table
  107.      below.
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.                                                                         PPPPaaaaggggeeee 2222
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  137.  
  138.  
  139.  
  140.            POLICY TYPE           POLICY NAME              ARGUMENTS
  141.         __________________________________________________________________
  142.         Placement Policy     PlacementDefault       Number Of Threads
  143.                              PlacementFixed         Memory Locality Domain
  144.                              PlacementFirstTouch    No Arguments
  145.                              PlacementRoundRobin    Roundrobin Mldset
  146.                              PlacementThreadLocal   Application Mldset
  147.                              PlacementCacheColor    Memory Locality Domain
  148.         __________________________________________________________________
  149.         Fallback Policy      FallbackDefault        No Arguments
  150.                              FallbackLargepage      No Arguments
  151.                              FallbackLocal          No Arguments
  152.         __________________________________________________________________
  153.         Replication Policy   ReplicationDefault     No Arguments
  154.                              ReplicationOne         No Arguments
  155.         __________________________________________________________________
  156.         Migration Policy     MigrationDefault       No Arguments
  157.                              MigrationControl       migr_policy_uparms_t
  158.                              MigrationRefcnt        No Arguments
  159.         __________________________________________________________________
  160.         Paging Policy        PagingDefault          No Arguments
  161.         __________________________________________________________________
  162.         Page Size Policy     -                      Page size
  163.         __________________________________________________________________
  164.  
  165.      The following list briefly describes each policy.
  166.  
  167.      PlacementDefault      This policy automatically creates and places an MLD
  168.                            for every two processes in a process group on an
  169.                            Origin 2000/200. For the Origin 3000 this policy
  170.                            creates and places an MLD for every four processes
  171.                            in a process group. The number of processes is
  172.                            provided as a passed in argument.  Each process's
  173.                            memory affinity link (memory affinity hint used by
  174.                            the process scheduler) is automatically set to the
  175.                            MLD created on behalf of the process. The MLD(s)
  176.                            estimate a memory affinity hint based on the size
  177.                            of the currently running process address space.
  178.                            Memory is allocated by referencing the MLD being
  179.                            used as the memory affinity link for the currently
  180.                            running process. By using this policy the
  181.                            application does not need to create and place
  182.                            MLD(s) or an MLDSET.
  183.  
  184.      PlacementFixed        This policy requires a placed MLD to be passed as
  185.                            an argument. All memory allocation is done using
  186.                            the node where the MLD has been placed.
  187.  
  188.      PlacementFirstTouch   This policy starts with the creation of one MLD,
  189.                            placing it on the node where creation happened. All
  190.                            memory allocation is done using the node where the
  191.                            MLD has been placed.
  192.  
  193.  
  194.  
  195.  
  196.  
  197.                                                                         PPPPaaaaggggeeee 3333
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  205.  
  206.  
  207.  
  208.      PlacementRoundRobin   This policy requires a placed MLDSET to be passed
  209.                            as an argument. Memory allocation happens in a
  210.                            round robin fashion over each one of the MLDs in
  211.                            the MLDSET. The policy maintains a round robin
  212.                            pointer that points to the next MLD to be used for
  213.                            memory allocation, which is moved to point to the
  214.                            next MLD in the MLDSET after every successful
  215.                            memory allocation. Note that the round robin
  216.                            operation is done in the time axis, not the space
  217.                            axis.
  218.  
  219.      PlacementThreadLocal  This policy requires a placed MLDSET to be passed
  220.                            as an argument. The application has to set the
  221.                            affinity links for all processes in the process
  222.                            group. Memory is allocated using the MLD being used
  223.                            as the memory affinity link for the currently
  224.                            running process.
  225.  
  226.      PlacementCacheColor   This policy requires a placed MLD to be passed as
  227.                            an argument. The application is responsible for
  228.                            setting the memory affinity links. Memory is
  229.                            allocated using the specified MLD, with careful
  230.                            attention to cache coloring relative to the Policy
  231.                            Module instead of the global virtual address space.
  232.  
  233.      FallbackDefault       The default fallback policy has two possible
  234.                            behaviours, depending on the large page wait
  235.                            timeout value. If the page wait timeout value is
  236.                            zero, then the use of large pages is considered to
  237.                            be opportunistic.  This means that locality is
  238.                            given a priority over large pages.
  239.  
  240.                            If the large page wait timeout value is non zero,
  241.                            the the use of large pages is considered to be a
  242.                            priority over locality. FallbackLargepage
  243.                            methodology is used internally when the default
  244.                            policy has a non zero page wait timeout value. For
  245.                            this case, see the description of FallbackLargepage
  246.                            for details.
  247.  
  248.                            The remaining description is for fallback actions
  249.                            on opportunistic requests for large pages.  If a
  250.                            large page of the requested size is not available
  251.                            on the requested node, then first attempt to find
  252.                            smaller pages sizes that are available on the
  253.                            requested node. If no smaller large pages sizes are
  254.                            configured or available on the requested node, then
  255.                            base page sizes are considered to fill the request
  256.                            on the requested node.
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.                                                                         PPPPaaaaggggeeee 4444
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  271.  
  272.  
  273.  
  274.                            The actions taken when memory is not available on
  275.                            the requested node is:
  276.  
  277.                            - Try to allocate a base pagesize on other mlds in
  278.                              this mldset (if an mldset is in effect).
  279.  
  280.                            - Then try to allocate a base pagesize on
  281.                              neighboring nodes that are in the
  282.                              effective_nodemask.
  283.  
  284.                            - Then try to allocate a base pagesize on
  285.                              neighboring nodes ignoring the
  286.                              effective_nodemask.
  287.  
  288.                            - Finally try to allocate a base pagesize on
  289.                              neighboring nodes ignoring the
  290.                              effective_nodemask, in effect all nodes in the
  291.                              system.
  292.  
  293.  
  294.      FallbackLargepage     When this fallback policy is selected, we give
  295.                            priority to the page size. We first try to allocate
  296.                            a page of the requested size on a nearby node, then
  297.                            try the next smaller page size on the requested
  298.                            node and nearby neighbor nodes, and finally
  299.                            fallback to a base page only if a large page of
  300.                            this size or lower is not available on any node in
  301.                            the system.
  302.                            The actions taken when memory is not available on
  303.                            the requested node is to consider a group of other
  304.                            nodes in a progressively broader criteria.  The
  305.                            progression is:
  306.  
  307.                            - Try to allocate the requested pagesize on other
  308.                              mlds in this mldset (if an mldset is in effect).
  309.  
  310.                            - Then try to allocate the requested pagesize on
  311.                              neighboring nodes that are in the
  312.                              effective_nodemask.
  313.  
  314.                            - Switch to the next lower large page size and
  315.                              repeat the search sequence of local node, nodes
  316.                              in the mldset, and remaining nodes of the
  317.                              effecive nodemask.
  318.  
  319.                            - If no large pages of any size are available, try
  320.                              to allocate a default pagesize on the requested
  321.                              node.
  322.  
  323.                            - Then try to allocate the default pagesize on
  324.                              other mlds in this mldset (if available).
  325.  
  326.  
  327.  
  328.  
  329.                                                                         PPPPaaaaggggeeee 5555
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  337.  
  338.  
  339.  
  340.                            - Then try to allocate a default pagesize on
  341.                              neighboring nodes that are in the
  342.                              effective_nodemask.
  343.  
  344.                            - Then try to allocate the requested pagesize on
  345.                              neighboring nodes ignoring the
  346.                              effective_nodemask.
  347.  
  348.                            - Finally try to allocate a default pagesize on
  349.                              neighboring nodes ignoring the
  350.                              effective_nodemask, in effect all nodes in the
  351.                              system.
  352.  
  353.  
  354.      FallbackLocal         The local fallback policy gives priority to
  355.                            locality. We first try to allocate a base page
  356.                            (16KB in Origin systems) on the requested node. If
  357.                            no memory is available on that node, we borrow from
  358.                            some close neighbor, following a spiral search
  359.                            path. This policy is nearly identical to
  360.                            FallbackDefault, and is kept for compatibility
  361.                            reasons.
  362.                            The actions taken when memory is not available on
  363.                            the requested node is to consider a group of other
  364.                            nodes in a progressively broader criteria.  The
  365.                            progression is:
  366.  
  367.                            - Try to allocate the requested pagesize on other
  368.                              mlds in this mldset (if an mldset is in effect).
  369.  
  370.                            - Then try to allocate the requested pagesize on
  371.                              neighboring nodes that are in the
  372.                              effective_nodemask.
  373.  
  374.                            - Then try to allocate a default pagesize on the
  375.                              requested node.
  376.  
  377.                            - Then try to allocate the default pagesize on
  378.                              other mlds in this mldset (if available).
  379.  
  380.                            - Then try to allocate a default pagesize on
  381.                              neighboring nodes that are in the
  382.                              effective_nodemask.
  383.  
  384.                            - Then try to allocate the requested pagesize on
  385.                              neighboring nodes ignoring the
  386.                              effective_nodemask.
  387.  
  388.                            - Finally try to allocate a default pagesize on
  389.                              neighboring nodes ignoring the
  390.                              effective_nodemask, in effect all nodes in the
  391.                              system.
  392.  
  393.  
  394.  
  395.                                                                         PPPPaaaaggggeeee 6666
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  403.  
  404.  
  405.  
  406.      ReplicationDefault    This policy has not been implemented. Applying the
  407.                            ReplicationDefault policy has no effect.
  408.  
  409.      ReplicationOne        This policy has not been implemented. Applying the
  410.                            ReplicationOne policy has no effect.
  411.  
  412.      MigrationDefault      When this default migration policy is selected,
  413.                            migration behaves as explained in migration(5)
  414.                            according to the tunable parameters also described
  415.                            in migration(5).
  416.  
  417.      MigrationControl      Users can select different migration parameters
  418.                            when using this policy. It takes an argument of
  419.                            type migr_policy_uparms_t shown below.
  420.  
  421.                            typedef struct migr_policy_uparms {
  422.                                    __uint64_t  migr_base_enabled         :1,
  423.                                                migr_base_threshold       :8,
  424.                                                migr_freeze_enabled       :1,
  425.                                                migr_freeze_threshold     :8,
  426.                                                migr_melt_enabled         :1,
  427.                                                migr_melt_threshold       :8,
  428.                                                migr_enqonfail_enabled    :1,
  429.                                                migr_dampening_enabled    :1,
  430.                                                migr_dampening_factor     :8,
  431.                                                migr_refcnt_enabled       :1; }
  432.                            migr_policy_uparms_t;
  433.  
  434.                            This structure allows users to override the default
  435.                            migration parameters defined in
  436.                            /var/sysgen/mtune/numa and described in
  437.                            migration(5).
  438.  
  439.                            - mmmmiiiiggggrrrr____bbbbaaaasssseeee____eeeennnnaaaabbbblllleeeedddd enables (1) or disables (0)
  440.                              migration.
  441.  
  442.                            - mmmmiiiiggggrrrr____bbbbaaaasssseeee____tttthhhhrrrreeeesssshhhhoooolllldddd defines the migration
  443.                              threshold.
  444.  
  445.                            - mmmmiiiiggggrrrr____ffffrrrreeeeeeeezzzzeeee____eeeennnnaaaabbbblllleeeedddd enables (1) or disables (0)
  446.                              freezing.
  447.  
  448.                            - mmmmiiiiggggrrrr____ffffrrrreeeeeeeezzzzeeee____tttthhhhrrrreeeesssshhhhoooolllldddd defines the freezing
  449.                              threshold.
  450.  
  451.                            - mmmmiiiiggggrrrr____mmmmeeeelllltttt____eeeennnnaaaabbbblllleeeedddd enables (1) or disables (0)
  452.                              melting.
  453.  
  454.                            - mmmmiiiiggggrrrr____mmmmeeeelllltttt____tttthhhhrrrreeeesssshhhhoooolllldddd defines the melting
  455.                              threshold.
  456.  
  457.  
  458.  
  459.  
  460.  
  461.                                                                         PPPPaaaaggggeeee 7777
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  469.  
  470.  
  471.  
  472.                            - mmmmiiiiggggrrrr____eeeennnnqqqqoooonnnnffffaaaaiiiillll____eeeennnnaaaabbbblllleeeedddd is a no-op for IRIX 6.5
  473.                              and earlier.
  474.  
  475.                            - mmmmiiiiggggrrrr____ddddaaaammmmppppeeeennnniiiinnnngggg____eeeennnnaaaabbbblllleeeedddd enables (1) or disables
  476.                              (0) dampening.
  477.  
  478.                            - mmmmiiiiggggrrrr____ddddaaaammmmppppeeeennnniiiinnnngggg____ffffaaaaccccttttoooorrrr defines the dampening
  479.                              threshold.
  480.  
  481.                            - mmmmiiiiggggrrrr____rrrreeeeffffccccnnnntttt____eeeennnnaaaabbbblllleeeedddd enables (1) or disables (0)
  482.                              extended reference counters.
  483.  
  484.      MigrationRefcnt       This policy turns migration completely off (for the
  485.                            associated section of virtual address space) and
  486.                            enables the extended reference counters.  No
  487.                            arguments are needed.
  488.  
  489.      PagingDefault         There is no selectable paging policy. This name is
  490.                            retained for compatibility reasons.
  491.  
  492.      Page Size             Users can select any of the page sizes supported by
  493.                            the IRIX kernel being used. For IRIX64 kernels the
  494.                            allowed sizes are:  16KB, 64KB, 256KB, 1024KB
  495.                            (1MB), 4096KB (4MB), and 16384KB (16MB).  For
  496.                            IRIX32 kernels the page size is 4KB only. Selecting
  497.                            any other page size will have no effect.
  498.  
  499.    CCCCrrrreeeeaaaattttiiiioooonnnn ooooffff PPPPoooolllliiiiccccyyyy MMMMoooodddduuuulllleeeessss
  500.      A policy module can be created using the following Memory Management
  501.      Control Interface call:
  502.  
  503.           typedef struct policy_set {
  504.                   char*  placement_policy_name;
  505.                   void*  placement_policy_args;
  506.                   char*  fallback_policy_name;
  507.                   void*  fallback_policy_args;
  508.                   char*  replication_policy_name;
  509.                   void*  replication_policy_args;
  510.                   char*  migration_policy_name;
  511.                   void*  migration_policy_args;
  512.                   char*  paging_policy_name;
  513.                   void*  paging_policy_args;
  514.                   size_t page_size;
  515.                             short  page_wait_timeout;
  516.                             short  policy_flags;
  517.           } policy_set_t;
  518.  
  519.           pmo_handle_t pm_create(policy_set_t* policy_set);
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.                                                                         PPPPaaaaggggeeee 8888
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  535.  
  536.  
  537.  
  538.      The policy_set_t structure contains all the data required to create a
  539.      Policy Module. For each selectable policy listed above, this structure
  540.      contains a field to specify the name of the selected policy and the list
  541.      of possible arguments that the selected policy may require. The page size
  542.      policy is the exception, for which the specification of the wanted page
  543.      size suffices. Pages of larger sizes reduce TLBMISS overhead and can
  544.      improve the performance of applications with large working sets. Like
  545.      other system resources large pages are not guaranteed to be available in
  546.      the system when the application makes the request. The application has
  547.      two choices. It can either wait for a specified timeout or use a page of
  548.      lower page size. The page_wait_timeout specifies the number of seconds a
  549.      process can wait for a page of the requested size to be available. If the
  550.      timeout value is zero or if the page of the requested size is not
  551.      available even after waiting for the specified timeout the system uses a
  552.      page of a lower page size.  The policy_flags field allows users to
  553.      specify special behaviors that apply to all the policies that define a
  554.      Policy Module. The only special behavior currently implemented forces the
  555.      memory allocator to prioritize cache coloring over locality, and it can
  556.      be selected using the flag PPPPOOOOLLLLIIIICCCCYYYY____CCCCAAAACCCCHHHHEEEE____CCCCOOOOLLLLOOOORRRR____FFFFIIIIRRRRSSSSTTTT. For example:
  557.  
  558.                policy_set.placement_policy_name = "PlacementFixed";
  559.                policy_set.placement_policy_args = (void *)mld_handle;
  560.                policy_set.fallback_policy_name = "FallbackDefault";
  561.                policy_set.fallback_policy_args = NULL;
  562.                policy_set.replication_policy_name = "ReplicationDefault";
  563.                policy_set.replication_policy_args = NULL;
  564.                policy_set.migration_policy_name = "MigrationDefault";
  565.                policy_set.migration_policy_args = NULL;
  566.                policy_set.paging_policy_name = "PagingDefault";
  567.                policy_set.paging_policy_args = NULL;
  568.                policy_set.page_size = PM_PAGESZ_DEFAULT;
  569.                policy_set.page_wait_timeout = 0;
  570.                policy_set.policy_flags = POLICY_CACHE_COLOR_FIRST;
  571.  
  572.  
  573.      This example is filling up the policy_set_t structure to create a PM with
  574.      a placement policy called "PlacementFixed" which takes a Memory Locality
  575.      Domain (MLD) as an argument. All other policies are set to be the default
  576.      policies, including the page size. We also ask for cache coloring to be
  577.      given precedence over locality.
  578.  
  579.      Since filling up this structure with mostly default values is a common
  580.      operation, we provide a special call to pre-fill this structure with
  581.      default values:
  582.  
  583.                void pm_filldefault(policy_set_t* policy_set);
  584.  
  585.  
  586.      The pm_create call returns a handle to the Policy Module just created, or
  587.      a negative long integer in case of error, in which case errno is set to
  588.      the corresponding error code. The handle returned by pm_create is of type
  589.      pmo_handle_t. The acronym PMO stands for Policy Management Object. This
  590.  
  591.  
  592.  
  593.                                                                         PPPPaaaaggggeeee 9999
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  601.  
  602.  
  603.  
  604.      type is common for all handles returned by all the Memory Management
  605.      Control Interface calls. These handles are used to identify the different
  606.      memory control objects created for an address space, much in the same way
  607.      as file descriptors are used to identify open files or devices. Every
  608.      address space contains one independent PMO table. A new table is created
  609.      only when a process execs.
  610.  
  611.      A simpler way to create a Policy Module is to used the restricted Policy
  612.      Module creation call:
  613.  
  614.                pmo_handle_t pm_create_simple(char* plac_name,
  615.                                              void* plac_args,
  616.                                              char* repl_name,
  617.                                              void* repl_args,
  618.                                              size_t page_size);
  619.  
  620.  
  621.      This call allows for the specification of only the Placement Policy, the
  622.      Replication Policy and the Page Size. Defaults are automatically chosen
  623.      for the Fallback Policy, the Migration Policy, and the Paging Policy.
  624.  
  625.    AAAAssssssssoooocccciiiiaaaattttiiiioooonnnn ooooffff VVVViiiirrrrttttuuuuaaaallll AAAAddddddddrrrreeeessssssss SSSSppppaaaacccceeee SSSSeeeeccccttttiiiioooonnnnssss
  626.      The Memory Management Control Interface allows users to select different
  627.      policies for different sections of a virtual address space, down to the
  628.      granularity of a page. To associate a virtual address space section with
  629.      a set of policies, users need to first create a Policy Module with the
  630.      wanted policies, as described in the previous section, and then use the
  631.      following MMCI call:
  632.  
  633.           int pm_attach(pmo_handle_t pm_handle, void* base_addr, size_t
  634.           length);
  635.  
  636.      The ppppmmmm____hhhhaaaannnnddddlllleeee identifies the Policy Module the user has previously
  637.      created, bbbbaaaasssseeee____aaaaddddddddrrrr is the base virtual address of the virtual address
  638.      space section the user wants to associate to the set of policies, and
  639.      lllleeeennnnggggtttthhhh is the length of the section.
  640.  
  641.      All physical memory allocated on behalf of a virtual address space
  642.      section with a newly attached policy module follows the policies
  643.      specified by this policy module. Physical memory that has already been
  644.      allocated is not affected until the page is either migrated or swapped
  645.      out to disk and then brought back into memory.
  646.  
  647.      Only existing address space mappings are affected by this call. For
  648.      example, if a file is memory-mapped to a virtual address space section
  649.      for which a policy module was previously associated via ppppmmmm____aaaattttttttaaaacccchhhh, the
  650.      default policies will be applied rather than those specified by the
  651.      ppppmmmm____aaaattttttttaaaacccchhhh call.
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.                                                                        PPPPaaaaggggeeee 11110000
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  667.  
  668.  
  669.  
  670.    DDDDeeeeffffaaaauuuulllltttt PPPPoooolllliiiiccccyyyy MMMMoooodddduuuulllleeee
  671.      A new Default Policy Module is created and inserted in the PMO Name Space
  672.      every time a process execs. This Default PM is used to define memory
  673.      management policies for all freshly created memory regions. This Default
  674.      PM can be later overridden by users via the pm_attach MMCI call.  This
  675.      Default Policy Module is created with the policies listed below:
  676.  
  677.      * PlacementDefault
  678.  
  679.      * FallbackDefault
  680.  
  681.      * ReplicationDefault
  682.  
  683.      * MigrationDefault
  684.  
  685.      * PagingDefault
  686.  
  687.      * Page size: 16KB
  688.  
  689.      * Flags: 0
  690.  
  691.      The Default Policy Module is used in the following situations:
  692.  
  693.      - At exec time, when we create the basic memory regions for the stack,
  694.        text, and heap.
  695.  
  696.      - At fork time, when we create all the private memory regions.
  697.  
  698.      - At sproc time, when we create all the private memory regions (at least
  699.        the stack when the complete address space is shared).
  700.  
  701.      - When mmapping a file or a device.
  702.  
  703.      - When growing the stack and we find that the stack's region has been
  704.        removed by the user via unmap, or the user has done a setcontext,
  705.        moving the stack to a new location.
  706.  
  707.      - When sbreaking and we find the user has removed the associated region
  708.        using munmap, or the region was not growable, anonymous or copy-on-
  709.        write.
  710.  
  711.      - When a process attaches a portion of the address space of a "monitored"
  712.        process via procfs, and a new region needs to be created.
  713.  
  714.      - When a user attaches a SYSV shared memory region.
  715.  
  716.      The Default Policy Module is also stored in the per-process group PMO
  717.      Name space, and therefore follows the same inheritance rules as all
  718.      Policy Modules:  it is inherited at fork or sproc time, and a new one is
  719.      created at exec time.
  720.  
  721.  
  722.  
  723.  
  724.  
  725.                                                                        PPPPaaaaggggeeee 11111111
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  733.  
  734.  
  735.  
  736.      Users can select a new default policy module for the stack, text, and
  737.      heap:
  738.  
  739.                pmo_handle_t
  740.                pm_setdefault(pmo_handle_t pm_handle, mem_type_t mem_type);
  741.  
  742.  
  743.      The argument pm_handle is the handle returned by pm_create. The argument
  744.      mem_type is used to identify the memory section the user wants to change
  745.      the default policy module for, and it can take any of the following 3
  746.      values:
  747.  
  748.      +o MEM_STACK
  749.  
  750.      +o MEM_TEXT
  751.  
  752.      +o MEM_DATA
  753.  
  754.      Users can also obtain a handle to the default PM using the following
  755.      call:
  756.  
  757.                pmo_handle_t pm_getdefault(mem_type_t mem_type);
  758.  
  759.  
  760.      This call returns a PMO handle referring to the calling process's address
  761.      space default PM for the specified memory type. The handle is greater or
  762.      equal to zero when the call succeeds, and it is less than zero when the
  763.      call fails, and errno is set to the appropriate error code.
  764.  
  765.    DDDDeeeessssttttrrrruuuuccccttttiiiioooonnnn ooooffff aaaa PPPPoooolllliiiiccccyyyy MMMMoooodddduuuulllleeee
  766.      Policy Modules are automatically destructed when all the members of a
  767.      process group or a shared group have died. However, users can explicitly
  768.      ask the operating system to destroy Policy Modules that are not in use
  769.      any more, using the following call:
  770.  
  771.                int pm_destroy(pmo_handle_t pm_handle);
  772.  
  773.  
  774.      The argument pm_handle is the handle returned by pm_create. Any
  775.      association to this PM that already exists will remain effective, and the
  776.      PM will only be destroyed when the section of the address space that is
  777.      associated to this PM is also destroyed (unmapped), or when the
  778.      association is overridden via a pm_attach call.
  779.  
  780.    PPPPoooolllliiiiccccyyyy SSSSttttaaaattttuuuussss ooooffff aaaannnn AAAAddddddddrrrreeeessssssss SSSSppppaaaacccceeee
  781.      Users can obtain the list of policy modules currently associated to a
  782.      section of a virtual address space using the following call:
  783.  
  784.                typedef struct pmo_handle_list {
  785.                        pmo_handle_t* handles;
  786.                        uint          length;
  787.                } pmo_handle_list_t;
  788.  
  789.  
  790.  
  791.                                                                        PPPPaaaaggggeeee 11112222
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  799.  
  800.  
  801.  
  802.                int pm_getall(void* base_addr,
  803.                              size_t length,
  804.                              pmo_handle_list_t* pmo_handle_list);
  805.  
  806.  
  807.  
  808.      The argument base_addr is the base address for the section the user is
  809.      inquiring about, length is the length of the section, and pmo_handle_list
  810.      is a pointer to a list of handles as defined by the structure
  811.      pmo_handle_list_t.
  812.  
  813.      On success, this call returns the effective number of PMs that are being
  814.      used by the specified virtual address space range. If this number is
  815.      greater than the size of the list to be used as a container for the PM
  816.      handles, the user can infer that the specified virtual address space
  817.      range is using more PMs than we can fit in the list. On failure, this
  818.      call returns a negative integer, and errno is set to the corresponding
  819.      error code.
  820.  
  821.      Users also have read-only access to the internal details of a PM, using
  822.      the following call:
  823.  
  824.                typedef struct pm_stat {
  825.                        char         placement_policy_name[PM_NAME_SIZE + 1];
  826.                        char         fallback_policy_name[PM_NAME_SIZE + 1];
  827.                        char         replication_policy_name[PM_NAME_SIZE + 1];
  828.                        char         migration_policy_name[PM_NAME_SIZE + 1];
  829.                        char         paging_policy_name[PM_NAME_SIZE + 1];
  830.                        size_t       page_size;
  831.                        int          policy_flags;
  832.                        pmo_handle_t pmo_handle;
  833.                } pm_stat_t;
  834.  
  835.                int pm_getstat(pmo_handle_t pm_handle, pm_stat_t* pm_stat);
  836.  
  837.  
  838.      The argument pm_handle identifies the PM the user needs information
  839.      about, and pm_stat is an out parameter of the form defined by the
  840.      structure pm_stat_t.  On success this call returns a non-negative
  841.      integer, and the PM internal data in pm_stat. On error, the call returns
  842.      a negative integer, and errno is set to the corresponding error code.
  843.  
  844.    SSSSeeeettttttttiiiinnnngggg tttthhhheeee PPPPaaaaggggeeee SSSSiiiizzzzeeee
  845.      Users can modify the page size of a PM using the following MMCI call:
  846.  
  847.                int pm_setpagesize(pmo_handle_t pm_handle, size_t page_size);
  848.  
  849.  
  850.      The argument pm_handle identifies the PM the user is changing the page
  851.      size for, and the argument page_size is the requested page size. This
  852.      call changes the page size for the PMs associated with the specified
  853.      section of virtual address space so that newly allocated memory will use
  854.  
  855.  
  856.  
  857.                                                                        PPPPaaaaggggeeee 11113333
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  865.  
  866.  
  867.  
  868.      the new page size.  On success this call returns a non-negative integer,
  869.      and on error, it returns a negative integer with errno set to the
  870.      corresponding error code.
  871.  
  872.    LLLLooooccccaaaalllliiiittttyyyy MMMMaaaannnnaaaaggggeeeemmmmeeeennnntttt
  873.      One of the most important goals of memory management for the Origin
  874.      platforms is the maximization of locality. IRIX uses several mechanisms
  875.      to manage locality:
  876.  
  877.      +o IRIX schedules memory in such a way that applications can allocate
  878.        large amounts of relatively close memory pages.
  879.  
  880.      +o IRIX does topology aware initial memory placement.
  881.  
  882.      +o IRIX provides a topology aware process scheduler that integrates cache
  883.        and memory affinity into the scheduling algorithms.
  884.  
  885.      +o IRIX allows and encourages application writers to provide initial
  886.        placement hints, using high level tools, compiler directives, or direct
  887.        system calls.
  888.  
  889.      +o IRIX allows users to select different policies for the most important
  890.        memory management operations.
  891.  
  892.      +o For Origin 2000 systems only, IRIX implements dynamic memory migration
  893.        to automatically attract memory to those processes that are making the
  894.        heaviest use of a page of memory.
  895.  
  896.    TTTThhhheeee PPPPllllaaaacccceeeemmmmeeeennnntttt PPPPoooolllliiiiccccyyyy
  897.      The Placement Policy defines the algorithm used by the physical memory
  898.      allocator to decide what memory source to use to allocate a page in a
  899.      multi-node CCNUMA machine. The goal of this algorithm is to place memory
  900.      in such a way that local accesses are maximized.
  901.  
  902.      The optimal placement algorithm would have knowledge of the exact number
  903.      of cache misses that will be caused by each thread sharing the page to be
  904.      placed.  Using this knowledge, the algorithm would place the page on the
  905.      node currently running the thread that will generate most cache misses,
  906.      assuming that the thread always stays on the same node.
  907.  
  908.      Unfortunately, we do not have perfect knowledge of the future. The
  909.      algorithm has to be based on heuristics that predict the memory access
  910.      patterns and cache misses on a page, or on user provided hints.
  911.  
  912.      All placement policies are based on two abstractions of physical memory
  913.      nodes:
  914.  
  915.      +o Memory Locality Domains (MLDs)
  916.  
  917.      +o Memory Locality Domain Sets (MLDsets)
  918.  
  919.  
  920.  
  921.  
  922.  
  923.                                                                        PPPPaaaaggggeeee 11114444
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  931.  
  932.  
  933.  
  934.    MMMMeeeemmmmoooorrrryyyy LLLLooooccccaaaalllliiiittttyyyy DDDDoooommmmaaaaiiiinnnnssss
  935.      A Memory Locality Domain or MLD with center c and radius r is a source of
  936.      physical memory composed of all memory nodes within a "hop distance" r of
  937.      a center node c. Normally, MLDs have radius 0,representing one single
  938.      node.
  939.  
  940.      MLDs may be interpreted as virtual memory nodes. Normally the application
  941.      writer defining MLDs specifies the MLD radius, and lets the operating
  942.      system decide where it will be centered. The operating system tries to
  943.      choose a center according to current memory availability and other
  944.      placement parameters that the user may have specified such as device
  945.      affinity and topology.
  946.  
  947.      Users can create MLDs using the following MMCI call:
  948.  
  949.                pmo_handle_t mld_create(int radius, long size);
  950.  
  951.  
  952.      The argument radius defines the MLD radius, and the argument size is a
  953.      hint specifying approximately how much physical memory will be required
  954.      for this MLD.  On success this call returns a handle for the newly
  955.      created MLD. On error, this call returns a negative long integer and
  956.      errno is set to the corresponding error code.
  957.  
  958.      MLDs are not placed when they are created. The MLD handle returned by the
  959.      constructor cannot be used until the MLD has been placed by making it
  960.      part of an MLDset.
  961.  
  962.      Users can also destroy MLDs not in use anymore using the following call:
  963.  
  964.                int mld_destroy(pmo_handle_t mld_handle);
  965.  
  966.  
  967.      The argument mld_handle is the handle returned by mld_create. On success,
  968.      this call returns a non-negative integer. On error it returns a negative
  969.      integer and errno is set to the corresponding error code.
  970.  
  971.    MMMMeeeemmmmoooorrrryyyy LLLLooooccccaaaalllliiiittttyyyy DDDDoooommmmaaaaiiiinnnn SSSSeeeettttssss
  972.      Memory Locality Domain Sets or MLDsets address the issue of placement
  973.      topology and device affinity.
  974.  
  975.      Users can create MLDsets using the following MMCI call:
  976.  
  977.           pmo_handle_t mldset_create(pmo_handle_t* mldlist, int mldlist_len);
  978.  
  979.      The argument mldlist is an array of MLD handles containing all the MLDs
  980.      the user wants to make part of the new MLDset, and the argument
  981.      mldlist_len is the number of MLD handles in the array. On success, this
  982.      call returns an MLDset handle. On error, this call returns a negative
  983.      long integer and errno is set to the corresponding error code.
  984.  
  985.  
  986.  
  987.  
  988.  
  989.                                                                        PPPPaaaaggggeeee 11115555
  990.  
  991.  
  992.  
  993.  
  994.  
  995.  
  996. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  997.  
  998.  
  999.  
  1000.      This call only creates a basic MLDset without any placement information.
  1001.      An MLDset in this state is useful just to specify groups of MLDs that
  1002.      have already been placed. In order to have the operating system place
  1003.      this MLDset, and therefore place all the MLDs that are now members of
  1004.      this MLDset, users have to specify the wanted MLDset topology and device
  1005.      affinity, using the following MMCI call:
  1006.  
  1007.                int mldset_place(pmo_handle_t mldset_handle,
  1008.                                 topology_type_t topology_type,
  1009.                                 raff_info_t* rafflist,
  1010.                                 int rafflist_len,
  1011.                                 rqmode_t rqmode);
  1012.  
  1013.  
  1014.      The argument mldset_handle is the MLDset handle returned by
  1015.      mldset_create, and identifies the MLDset the user is placing. The
  1016.      argument topology_type specifies the topology the operating system should
  1017.      consider in order to place this MLDset, which can be one of the
  1018.      following:
  1019.  
  1020.      TOPOLOGY_FREE        This topology specification lets the Operating
  1021.                           System decide what shape to use to allocate the set.
  1022.                           The Operating System will try to place this MLDset
  1023.                           on a cluster of physical nodes as compact as
  1024.                           possible, depending on the current system load.
  1025.  
  1026.      TOPOLOGY_CUBE        This topology specification is used to request a
  1027.                           cube-like shape.
  1028.  
  1029.      TOPOLOGY_CUBE_FIXED  This topology specification is used to request a
  1030.                           physical cube.
  1031.  
  1032.      TOPOLOGY_PHYSNODES   This topology specification is used to request that
  1033.                           the MLDs in an MLDset be placed in the exact
  1034.                           physical nodes enumerated in the device affinity
  1035.                           list, described below.
  1036.  
  1037.      TOPOLOGY_CPUCLUSTER  This topology specification is used to request the
  1038.                           placement of one MLD per CPU instead of the default
  1039.                           one MLD per node. In an Origin 3000, the number of
  1040.                           cpus on a fully populated node is 4, hence each node
  1041.                           can have up to 4 MLDs placed per node. For a node
  1042.                           with less than the maximum number of cpus available
  1043.                           the number of MLDs placed on that node will not
  1044.                           exceed the actual number of CPUs. Also if cpusets
  1045.                           are in use, the MLDs will be placed on nodes that
  1046.                           are part of the defined cpuset.  This topology is
  1047.                           useful when the placement policy is managing cache
  1048.                           coloring relative to MLDs instead of virtual memory
  1049.                           regions.
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.                                                                        PPPPaaaaggggeeee 11116666
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  1063.  
  1064.  
  1065.  
  1066.      The topology_type_t type shown below is defined in <sys/pmo.h>.
  1067.  
  1068.           /*
  1069.            * Topology types for mldsets
  1070.            */
  1071.           typedef enum {
  1072.                   TOPOLOGY_FREE,
  1073.                   TOPOLOGY_CUBE,
  1074.                   TOPOLOGY_CUBE_FIXED,
  1075.                   TOPOLOGY_PHYSNODES,
  1076.                   TOPOLOGY_CPUCLUSTER,
  1077.                   TOPOLOGY_LAST
  1078.           } topology_type_t;
  1079.  
  1080.  
  1081.      The argument rafflist is used to specify resource affinity. It is an
  1082.      array of resource specifications using the structure shown below:
  1083.  
  1084.           /*
  1085.            * Specification of resource affinity.
  1086.            * The resource is specified via a
  1087.            * file system name (dev, file, etc).
  1088.           */
  1089.           typedef struct raff_info {
  1090.                void* resource;
  1091.                ushort reslen;
  1092.                ushort restype;
  1093.                ushort radius;
  1094.                ushort attr;
  1095.           } raff_info_t;
  1096.  
  1097.  
  1098.  
  1099.      The fields resource, reslen, and restype define the resource. The field
  1100.      resource is used to specify the name of the resource, the field reslen
  1101.      must always be set to the actual number of bytes the resource pointer
  1102.      points to, and the field restype specifies the kind of resource
  1103.      identification being used, which can be any of the following:
  1104.  
  1105.      RAFFIDT_NAME This resource identification type should be used for the
  1106.                   cases where a hardware graph path name is used to identify
  1107.                   the device.
  1108.  
  1109.      RAFFIDT_FD   This resource identification type should be used for the
  1110.                   cases where a file descriptor is being used to identify the
  1111.                   device.
  1112.  
  1113.      The radius field defines the maximum distance from the actual resource
  1114.      the user would like the MLDset to be place at. The attr field specified
  1115.      whether the user wants the MLDset to be placed close or far from the
  1116.      resource:
  1117.  
  1118.  
  1119.  
  1120.  
  1121.                                                                        PPPPaaaaggggeeee 11117777
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127.  
  1128. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  1129.  
  1130.  
  1131.  
  1132.      RAFFATTR_ATTRACTION The MLDset should be placed as close as possible to
  1133.                          the specified device.
  1134.  
  1135.      RAFFATTR_REPULSION  The MLDset should be placed as far as possible from
  1136.                          the specified device.
  1137.  
  1138.      The argument rafflist_len in the mldset_place call specifies the number
  1139.      of raff structures the user is passing via rafflist. There must be at
  1140.      least as many raff structures passed as the size of the corresponding
  1141.      mldset or the operation will fail and EINVAL will be returned.
  1142.  
  1143.      Finally, the rqmode argument is used to specify whether the placement
  1144.      request is ADVISORY or MANDATORY:
  1145.  
  1146.           /*
  1147.            * Request types
  1148.            */
  1149.           typedef enum {
  1150.                   RQMODE_ADVISORY,
  1151.                   RQMODE_MANDATORY
  1152.           } rqmode_t;
  1153.  
  1154.  
  1155.      The Operating System places the MLDset by finding a section of the
  1156.      machine that meets the requirements of topology, device affinity, and
  1157.      expected physical memory used.
  1158.  
  1159.      The mldset_place call returns a non-negative integer on success. On
  1160.      error, it returns a negative integer and errno is set to the
  1161.      corresponding error code.
  1162.  
  1163.      Users can destroy MLDsets using the following call:
  1164.  
  1165.           int mldset_destroy(pmo_handle_t mldset_handle);
  1166.  
  1167.  
  1168.      The argument mldset_handle identifies the MLDset to be destroyed. On
  1169.      success, this call returns a non-negative integer. On error it returns a
  1170.      negative integer and errno is set to the corresponding error code.
  1171.  
  1172.    LLLLiiiinnnnkkkkiiiinnnngggg EEEExxxxeeeeccccuuuuttttiiiioooonnnn TTTThhhhrrrreeeeaaaaddddssss ttttoooo MMMMLLLLDDDDssss
  1173.      After creating MLDs and placing them using an MLDset, a user can create a
  1174.      Policy Module that makes use of these memory sources, and attach sections
  1175.      of a virtual address space to this Policy Module.
  1176.  
  1177.      We still need to make sure that the application threads will be executed
  1178.      on the nodes where we are allocating memory. To ensure this, users need
  1179.      to link threads to MLDs using the following call:
  1180.  
  1181.           int process_mldlink(pid_t pid, pmo_handle_t mld_handle);
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.                                                                        PPPPaaaaggggeeee 11118888
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.  
  1194. mmmmmmmmcccciiii((((5555))))                                                                mmmmmmmmcccciiii((((5555))))
  1195.  
  1196.  
  1197.  
  1198.      The argument pid is the pid of the process to be linked to the MLD
  1199.      specified by the argument mld_handle. On success this call return a non-
  1200.      negative integer.  On error it returns a negative integer and errno is
  1201.      set to the corresponding error code.
  1202.  
  1203.      This call sets up a hint for the process scheduler. However, the process
  1204.      scheduler is not required to always run the process on the node specified
  1205.      by the mld. The scheduler may decide to temporarily use different cpus in
  1206.      different nodes to execute threads to maximize resource utilization.
  1207.  
  1208.    NNNNaaaammmmeeee SSSSppppaaaacccceeeessss FFFFoooorrrr MMMMeeeemmmmoooorrrryyyy MMMMaaaannnnaaaaggggeeeemmmmeeeennnntttt CCCCoooonnnnttttrrrroooollll
  1209.      +o TTTThhhheeee PPPPoooolllliiiiccccyyyy NNNNaaaammmmeeee SSSSppppaaaacccceeee. This is a global system name space that contains
  1210.        all the policies that have been exported and therefore are available to
  1211.        users.  The domain of this name space is the set of exported policy
  1212.        names, strings of characters such as "PlacementDefault", and its range
  1213.        is the corresponding set of policy constructors. When a user creates a
  1214.        policy module, he or she has to specify the policies for all selectable
  1215.        policies by name. Internally, the operating system searches for each
  1216.        name in the Policy Name Space, thereby getting hold of the constructors
  1217.        for each of the specified policies, which are used to initialize the
  1218.        actual internal policy modules.
  1219.  
  1220.      +o TTTThhhheeee PPPPoooolllliiiiccccyyyy MMMMaaaannnnaaaaggggeeeemmmmeeeennnntttt OOOObbbbjjjjeeeecccctttt NNNNaaaammmmeeee SSSSppppaaaacccceeee. This is a per-process group,
  1221.        either shared (sprocs) or not shared (forks), name space used to store
  1222.        handles for all the Policy Management Objects that have been created
  1223.        within the context of any of the members of the process group. The
  1224.        domain of this name space is the set of Policy Management Object (PMO)
  1225.        handles and its range is the set of references (internal kernel
  1226.        pointers) to the PMOs.
  1227.  
  1228.        PMO handles can refer to any of several kinds of Policy Management
  1229.        Objects:
  1230.  
  1231.        - Policy Modules
  1232.  
  1233.        - Memory Locality Domains (MLDs)
  1234.  
  1235.        - Memory Locality Domain Sets (MLDsets)
  1236.  
  1237.      The PMO Name Space is inherited at fork or sproc time, and created at
  1238.      exec time.
  1239.  
  1240. SSSSEEEEEEEE AAAALLLLSSSSOOOO
  1241.      numa(5), migration(5), mtune(4), /var/sysgen/mtune/numa, refcnt(5),
  1242.      nstats(1), sn(1), topology(1), mld(3c), mldset(3c), pm(3c),
  1243.      migration(3c), pminfo(3c), numa_view(1), dplace(1), dprof(1).
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.                                                                        PPPPaaaaggggeeee 11119999
  1254.  
  1255.  
  1256.  
  1257.